Ejercicio: satisfacción de los pacientes

Práctica guiada (clase 4)

Author

Silvia Pineda, Almudena Moreno y Javier Álvarez Liébana

Práctica 1

Para este ejercicio volveremos a usar la tabla de datos de satisfacción de pacientes en un hospital guardada en el archivo .csv llamada SatisfaccionPacientes.csv

library(tidyverse)

datos <-
  read_csv("./datos/SatisfaccionPacientes.csv") |> 
  janitor::clean_names()

Pregunta 1

Imitando la práctica anterior (pero intenta repetirlo sin mirar), trata la variable estado_salud como una cualitativa ORDINAL

Code
datos <-
  datos |> 
  mutate("estado_salud" =
           factor(estado_salud, levels = c("Malo", "Regular", "Bueno", "Excelente"),
                  ordered = TRUE))

Pregunta 2

Haz una tabla de frecuencias (absolutas) cruzada entre Género y Estado de salud (en la primera columna estén las opciones para género y en el nombre del resto de columnas las opciones para estado de salud)

Code
# Primero cuento de manera bidimensional con count(var1, var2)
conteo_bidim <-
  datos |>
  count(genero, estado_salud)
conteo_bidim
# A tibble: 7 × 3
  genero    estado_salud     n
  <chr>     <ord>        <int>
1 Femenino  Malo             5
2 Femenino  Regular         24
3 Femenino  Bueno           24
4 Masculino Malo            10
5 Masculino Regular         20
6 Masculino Bueno           16
7 Masculino Excelente        1
Code
# Después pivoto para que use la columna estado_salud
# como futuros nombres de variables (pivota de vertical a horizontal)
#   - names_from: de donde saldrán los futuros nombres de columnas
#   - values_from: de donde sacamos los valores numéricos (en este caso n)
#     para rellenar la tabla
tabla_freq_abs <-
  conteo_bidim |> pivot_wider(names_from = estado_salud, values_from = n)
tabla_freq_abs
# A tibble: 2 × 5
  genero     Malo Regular Bueno Excelente
  <chr>     <int>   <int> <int>     <int>
1 Femenino      5      24    24        NA
2 Masculino    10      20    16         1

También se puede hacer en R base con table() (que además de ser más sencillo respeta la jerarquía de la ordinal). Moraleja: a veces R base nos facilita la vida, no lo olvidemos.

tabla_freq <- table(datos$genero, datos$estado_salud)
tabla_freq
           
            Malo Regular Bueno Excelente
  Femenino     5      24    24         0
  Masculino   10      20    16         1

Pregunta 3

Calcula la tabla anterior con frecuencias relativa por filas y por columnas (es decir, dos tablas, una que toda las filas sumen el total, 1, y otra que las columnas sumen el total)

Code
prop.table(tabla_freq, margin = 1)
prop.table(tabla_freq, margin = 2)

También se puede hacer en tidyverse calculando antes la suma por filas y por columnas (pero más complicado). Moraleja: tablas de frecuencia podemos hacerlas en tidyverse pero bidimensionales R base nos ayuda mejor. No seamos talibanes de una forma de hacer las cosas, deberemos viajar entre los dos mundos muchas veces

Pregunta 4

Haciendo uso de la tabla anterior contesta a las siguientes preguntas:

  • ¿Qué porcentaje de entre las mujeres, tiene un buen estado de salud?

  • ¿Qué porcentaje de entre los hombres, tiene un estado de salud regular?

  • ¿Qué porcentaje de los que tienen estado de salud malo, son mujeres?

Clicka debajo para ver la respuesta

Code
# De entre las mujeres un 45.28% tiene un buen estado de salud
# De entre los hombres un 34.04% tiene un estado de salud regular
# Un 33.33% de los que tienen un estado de salud malo, son mujeres

Pregunta 5

Haciendo uso de la tabla de frecuencias del ejercicio 2, ejecuta el código que consideres para responder a la pregunta: ¿están estas dos variables (estado_salud y genero) asociadas? ¿Existe algún tipo de dependencia entre ellas? Hazlo considerando \(\alpha = 0.05\).

Code
# Uno de los contrastes vistos es la prueba de chi-cuadrado
# que nos permite sacar conclusiones sobre la independencia de
# dos variables cualitativas

# chisq.test() nos realiza el contraste haciendo uso de la tabla
# de frecuencias
chisq.test(tabla_freq)
Warning in chisq.test(tabla_freq): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  tabla_freq
X-squared = 4.2857, df = 3, p-value = 0.2322
Code
# Como el p-value = 0.2322 y alpha = 5%, no podemos rechazar la
# hipótesis nula de independencia: no hay evidencias suficientes 
# CON LA MUESTRA QUE TENEMOS para concluir que haya alguna asociación
# entre género y estado de salud

# otra prueba es el Test exacto de Fisher, especialmente útil cuando
# las frecuencias esperadas son bajas.
fisher.test(tabla_freq)

    Fisher's Exact Test for Count Data

data:  tabla_freq
p-value = 0.1974
alternative hypothesis: two.sided
Code
# Diferente p-valor pero misma conclusión

Pregunta 6

Las funciones chisq.test() y fisher.test() pueden tomar como argumento una tabla de frecuencias ya resumida o puede tomar dos variables y la función ya realiza el conteo. Por ejemplo si hacemos chisq.test(var1, var2) obtenemos un objeto htest que dentro contiene el p-valor.

test_chisq <- chisq.test(datos$genero, datos$estado_salud)
Warning in chisq.test(datos$genero, datos$estado_salud): Chi-squared
approximation may be incorrect
names(test_chisq)
[1] "statistic" "parameter" "p.value"   "method"    "data.name" "observed" 
[7] "expected"  "residuals" "stdres"   

Por tanto si aplicamos la función y hacemos después $p.value podemos obtener directamente el valor numérico que nos interesa

chisq.test(datos$genero, datos$estado_salud)$p.value
Warning in chisq.test(datos$genero, datos$estado_salud): Chi-squared
approximation may be incorrect
[1] 0.2322175

¿Cómo usar tidyverse para tener en una tabla resumen ambos p-valores?

Code
tabla_p_valores <-
  datos |> 
  summarise("sig_chisq" = chisq.test(genero, estado_salud)$p.value,
            "sig_fisher" = fisher.test(genero, estado_salud)$p.value)
Warning: There was 1 warning in `summarise()`.
ℹ In argument: `sig_chisq = chisq.test(genero, estado_salud)$p.value`.
Caused by warning in `chisq.test()`:
! Chi-squared approximation may be incorrect

IMPORTANTE: en muchas ocasiones estos resultados dependerán de la agrupación realizada. Si decidimos reagrupr

Pregunta 7

Cálcula la matriz correlaciones de Pearson entre las variables numéricas. ¿Existe dependencia LINEAL entre la variable edad y el tiempo de espera? (recuerda: correlación de Pearson solo mide asociación lineal)

Code
mat_cor <-
  datos |> 
  select(where(is.numeric)) |> 
  corrr::correlate()
Correlation computed with
• Method: 'pearson'
• Missing treated using: 'pairwise.complete.obs'
Code
# La correlación es de 0.0669 por lo que no parezca exista relación

Dibuja un diagrama de dispersión entre edad y tiempo de espera, incluyendo la recta de regresión, que distinga en los puntos un color distinto por género

Code
ggplot(datos, aes(x = edad, y = tiempo_espera)) +
  geom_point(aes(color = genero), size = 2, alpha = 0.7) +
  geom_smooth(se = FALSE, method = "lm", color = "#3b9559") +
  ggthemes::scale_color_colorblind() +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

Calcula en una tabla resumen la correlación y el p-valor derivado de un test de correlaciones entre ambas variables

Code
datos |> 
  summarise("cor" = cor(edad, tiempo_espera),
            "sig_cor" = cor.test(edad, tiempo_espera)$p.value)
# No parece existir evidencia significativa de dependencia lineal

Pregunta 8

Repite todo el ejercicio 7 con las variables tiempo de espera y grado de satisfacción

Code
datos |> 
  select(where(is.numeric)) |> 
  corrr::correlate()

ggplot(datos, aes(x = grado_satisfaccion, y = tiempo_espera)) +
  geom_point(aes(color = genero), size = 2, alpha = 0.7) +
  geom_smooth(se = FALSE, method = "lm", color = "#3b9559") +
  ggthemes::scale_color_colorblind() +
  theme_minimal()

datos |> 
    summarise("cor" = cor(grado_satisfaccion, tiempo_espera),
              "sig_cor" = cor.test(grado_satisfaccion, tiempo_espera)$p.value)
# Sí parece existir evidencia significativa de dependencia lineal
# concretamente negativa: a más espera, menor satisfacción

¿Cómo podríamos cambiar mínimamente el código de ggplot para que nos pinte dos rectas (una de cada color), una por cada género?

Code
ggplot(datos,
       aes(x = grado_satisfaccion, y = tiempo_espera, color = genero)) +
  geom_point(size = 2, alpha = 0.7) +
  geom_smooth(se = FALSE, method = "lm") +
  ggthemes::scale_color_colorblind() +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'